Spring Boot ক্লায়েন্টে RestTemplate
এবং WebClient
RESTful API কল করতে ব্যবহৃত হয়। তবে এদের ব্যবহার করার সময় কিছু পারফরম্যান্স ইস্যু দেখা দিতে পারে, যা অ্যাপ্লিকেশনের কার্যকারিতা এবং রেসপন্স টাইম প্রভাবিত করে। এখানে RestTemplate
এবং WebClient
-এর পারফরম্যান্স সম্পর্কিত ইস্যু এবং সেগুলো সমাধানের পদ্ধতি আলোচনা করা হলো:
RestTemplate
একটি ব্লকিং HTTP ক্লায়েন্ট। এটি সিঙ্ক্রোনাস পদ্ধতিতে কাজ করে এবং রেসপন্স না আসা পর্যন্ত থ্রেড আটকে রাখে। এই কারণে থ্রেড সংখ্যা বেশি হলে পারফরম্যান্স ড্রপ হয়।RestTemplate
পরিবর্তে WebClient
ব্যবহার করা উচিত।RestTemplate
প্রতি অনুরোধে একটি থ্রেড ব্যবহার করে। যদি অনেক অনুরোধ হয়, তবে থ্রেড পুল দ্রুত পূর্ণ হয়ে যায়।ThreadPoolTaskExecutor
বা ExecutorService
ব্যবহার করে কনফিগার করা যায়।HttpComponentsClientHttpRequestFactory
ব্যবহার করুন।import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(100); // সর্বোচ্চ কানেকশন সংখ্যা
connectionManager.setDefaultMaxPerRoute(20); // প্রতি রুটের জন্য সর্বোচ্চ কানেকশন সংখ্যা
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
return new RestTemplate(factory);
}
}
RestTemplate
বড় স্কেল অ্যাপ্লিকেশন বা মাইক্রোসার্ভিসের জন্য উপযুক্ত নয়। থ্রেড-ব্লকিং এর কারণে এটি বেশি লোড পরিচালনা করতে পারে না।WebClient
ব্যবহার করুন।WebClient
ব্যবহার করার জন্য সঠিক কনফিগারেশন প্রয়োজন। ডিফল্ট সেটিংস যথেষ্ট কার্যকর নয়।import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import java.time.Duration;
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient() {
HttpClient httpClient = HttpClient.create()
.responseTimeout(Duration.ofSeconds(5)) // টাইমআউট সেট করুন
.doOnConnected(conn ->
conn.addHandlerLast(new ReadTimeoutHandler(5))
.addHandlerLast(new WriteTimeoutHandler(5)));
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
}
}
WebClient
নতুন কানেকশন তৈরি করে। এটি কানেকশন পুলিং চালু না করলে পারফরম্যান্সে নেতিবাচক প্রভাব ফেলে।import reactor.netty.resources.ConnectionProvider;
HttpClient httpClient = HttpClient.create(
ConnectionProvider.builder("custom")
.maxConnections(50) // সর্বোচ্চ কানেকশন সংখ্যা
.pendingAcquireTimeout(Duration.ofSeconds(5)) // Pending timeout
.build()
);
WebClient webClient = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
buffer
এড়িয়ে stream
ব্যবহার করুন।Flux
ব্যবহার করে স্ট্রিম ডেটা প্রক্রিয়াকরণ করুন।public Flux<String> fetchLargeData(String url) {
return webClient.get()
.uri(url)
.retrieve()
.bodyToFlux(String.class); // ডেটা স্ট্রিম আকারে প্রসেসিং
}
WebClient
টাইমআউট কনফিগার করা থাকে না, যা অপ্রয়োজনীয় বিলম্ব সৃষ্টি করতে পারে।HttpClient httpClient = HttpClient.create()
.responseTimeout(Duration.ofSeconds(5)); // রেসপন্স টাইমআউট
WebClient webClient = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
ফিচার | RestTemplate | WebClient |
---|---|---|
Nature | Blocking | Non-blocking |
Concurrency | Low | High |
Scalability | Limited | Highly scalable |
Configuration | Simple | Requires proper configuration |
Use Case | Legacy or simple synchronous apps | Modern, reactive, and scalable apps |
Read more